home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Netware Super Library
/
Netware Super Library.iso
/
menu_pgm
/
mcmenu
/
syssup.pas
< prev
next >
Wrap
Pascal/Delphi Source File
|
1992-08-22
|
10KB
|
373 lines
UNIT SysSup;
{ nov 23 91 tb
has screen blanker for programs that call allowkey
August 11 92 tb minor spelling fix for 'tuesday'
aug 23 92 1.520 set blank time to 5 minutes
}
{$D-,S-}
INTERFACE
USES Crt,Dos,Win;
CONST
bs=08;
esc=27;
left=18; {75}
right=04; {77}
up=5; {72}
down=24 {80};
space = 32;
return = 13;
hotkey = 59; {59}
blanks=' ';
TYPE
keysettype= SET OF CHAR;
helpstr= STRING[8];
VAR
helpon,inhelp: BOOLEAN;
curhelp: helpstr;
hasmouse: BOOLEAN;
blankerstr: STRING[80];
FUNCTION abs(a: INTEGER): INTEGER;
FUNCTION max(a,b: INTEGER): INTEGER;
FUNCTION min(a,b: INTEGER): INTEGER;
FUNCTION limit(low,high,amt: INTEGER): INTEGER;
FUNCTION querykey(VAR key: CHAR): BOOLEAN;
FUNCTION allowkey(keysallowed: keysettype; scans: INTEGER): CHAR;
{ -1 in scans means wait until key hit any other amount is number of times
to check for key. If key is found it is returned as the function, if no
key is found then a CHR(0) is returned. }
FUNCTION readchar: CHAR;
PROCEDURE getxy(VAR x,y: INTEGER);
IMPLEMENTATION
VAR
blankon: BOOLEAN;
datestr: STRING[80];
PROCEDURE getdatetime;
VAR
year,month,day,dayofweek: WORD;
s: STRING;
hour,minute,second,sec100: WORD;
i: INTEGER;
BEGIN { getdatetime }
GetDate(year,month,day,dayofweek);
CASE dayofweek OF
0: datestr:='Sunday';
1: datestr:='Monday';
2: datestr:='Tuesday';
3: datestr:='Wednesday';
4: datestr:='Thursday';
5: datestr:='Friday';
6: datestr:='Saturday';
END; { CASE }
CASE month OF
1: datestr:= CONCAT(datestr,' January');
2: datestr:= CONCAT(datestr,' February');
3: datestr:= CONCAT(datestr,' March');
4: datestr:= CONCAT(datestr,' April');
5: datestr:= CONCAT(datestr,' May');
6: datestr:= CONCAT(datestr,' June');
7: datestr:= CONCAT(datestr,' July');
8: datestr:= CONCAT(datestr,' August');
9: datestr:= CONCAT(datestr,' September');
10: datestr:= CONCAT(datestr,' October');
11: datestr:= CONCAT(datestr,' November');
12: datestr:= CONCAT(datestr,' December');
END; { CASE }
STR(day:2,s);
datestr:= CONCAT(datestr,' ',s);
STR(year:4,s);
datestr:= CONCAT(datestr,' ',s);
GetTime(hour,minute,second,sec100);
STR(hour:2,s);
FOR i:= 1 TO LENGTH(s) DO
IF s[i]= ' ' THEN
s[i]:='0';
datestr:= CONCAT(datestr,' ',s);
STR(minute:2,s);
FOR i:= 1 TO LENGTH(s) DO
IF s[i]= ' ' THEN
s[i]:='0';
datestr:= CONCAT(datestr,':',s);
STR(second:2,s);
FOR i:= 1 TO LENGTH(s) DO
IF s[i]= ' ' THEN
s[i]:='0';
datestr:= CONCAT(datestr,':',s);
END; { getdatetime }
FUNCTION abs(a: INTEGER): INTEGER;
BEGIN { abs }
IF a < 0 THEN abs := -a ELSE abs := a;
END; { abs }
FUNCTION max(a,b: INTEGER): INTEGER;
BEGIN { max }
IF a > b THEN max := a ELSE max := b;
END; { max }
FUNCTION min(a,b: INTEGER): INTEGER;
BEGIN { min }
IF a < b THEN min := a ELSE min := b;
END; {min }
FUNCTION limit(low,high,amt: INTEGER): INTEGER;
BEGIN { limit }
IF amt < low THEN limit := low
ELSE IF amt > high THEN limit := high
ELSE limit := amt;
END; { limit }
function ReadChar: Char;
VAR
ch: CHAR;
reg: REGISTERS;
BEGIN
ch := readkey;
IF ch = #0 THEN
BEGIN
ch:= readkey;
if ch=CHR(75) then ch:=CHR(left);
if ch=CHR(77) then ch:=CHR(right);
if ch=CHR(72) then ch:=CHR(up);
if ch=CHR(80) then ch:=CHR(down);
IF NOT blankon THEN
BEGIN
IF ch=CHR(hotkey) THEN
BEGIN
IF (helpon AND NOT inhelp) THEN INTR(250,reg);
ch:=CHR(0);
END; { hotkey }
END; { NOT blankon }
END; { ch= 0 prefixed }
readchar := ch;
END; { readchar }
FUNCTION querykey(VAR key: CHAR): BOOLEAN;
VAR
keyhit: BOOLEAN;
reg: registers;
BEGIN { querykey }
{ check mouse }
keyhit:= FALSE;
key:=CHR(0);
delay(50); { give mickeys time to build up }
{ and time for keys to buffer }
IF hasmouse THEN
BEGIN
reg.AX:=05;
reg.BX:=0; { left button }
INTR($33,reg); { get button status }
keyhit:=reg.bx<>0;
IF keyhit THEN
key:=CHR(return);
IF NOT keyhit THEN
BEGIN
reg.AX:=05;
reg.BX:=1; { right button }
INTR($33,reg); { get button status }
keyhit:=reg.bx<>0;
IF keyhit THEN
key:=CHR(esc);
END;
IF NOT keyhit THEN
BEGIN
reg.AX:=$0B; { get mouse motion mickeys }
INTR($33,reg);
{ check mouse motion 25 mickeys to be effective }
{ neg val = up pos down }
keyhit:= ((reg.DX>25) AND (reg.DX<300))
OR ((reg.DX>65000) AND (reg.DX<65510));
IF keyhit THEN
IF reg.DX >300 THEN
key:= CHR(up)
ELSE
key:= CHR(down);
{ 0.720}
IF keyhit THEN
BEGIN
delay(150); { debounce mouse movement to 6 keys/second }
reg.AX:=$0B; { empty mouse mickey count }
INTR($33,reg);
END; { was valid mouse movement }
END;
END; { hasmouse }
keyhit:= keypressed OR keyhit;
IF keypressed THEN
key:= readchar;
querykey:= keyhit;
END; { querykey }
FUNCTION allowkey(keysallowed: keysettype; scans: INTEGER): CHAR;
{ -1 in scans means wait until key hit any other amount is number of times
to check for key. If key is found it is returned as the function, if no
key is found then a CHR(0) is returned. }
TYPE
winrec = RECORD
state: winstate;
buffer: POINTER;
END;
winrecptr = ^winrec;
CONST
timetoblank=300; { 1.520 }
timetomove=5; { 0.724 }
blankattr= lightgray+black*16;
mmsgattr= black+lightgray*16;
cmsgattr= lightgray+blue*16;
VAR
keyhit: BOOLEAN;
key: CHAR;
time: INTEGER;
ir: INTEGER;
ohour,omin,osec,osec100: WORD;
nhour,nmin,nsec,nsec100: WORD;
timelastmove: INTEGER;
blankwin: winrecptr;
msgwin: winrecptr;
oldwin: winstate;
x,y: INTEGER;
attr: INTEGER;
tscans: INTEGER;
PROCEDURE openwindow(x1, y1, x2, y2: BYTE;VAR w: winrecptr);
BEGIN
NEW(w);
WITH w^ DO
BEGIN
savewin(state);
window(x1, y1, x2, y2);
GETMEM(buffer, winsize);
readwin(buffer^);
END;
END;
PROCEDURE closewindow(VAR w: winrecptr);
BEGIN
WITH w^ DO
BEGIN
writewin(buffer^);
FREEMEM(buffer, winsize);
restorewin(state);
END;
DISPOSE(w);
END;
BEGIN { allowkey }
tscans:=scans;
IF lastmode=mono THEN
attr:=mmsgattr
ELSE
attr:=cmsgattr;
keyhit:= FALSE;
blankon:= FALSE;
gettime(ohour,omin,osec,osec100);
WHILE (tscans <> 0) AND NOT(keyhit) DO
BEGIN { WHILE }
gettime(nhour,nmin,nsec,nsec100);
IF nmin<omin THEN
nmin:=nmin+60;
IF blankon THEN
BEGIN
IF timetomove<= ((nmin*60)+nsec)-((omin*60)+osec)THEN
BEGIN
REPEAT
gettime(ohour,omin,osec,osec100);
UNTIL (osec MOD timetomove)=0; { 0.725 put onto regular boundry }
unframewin;
closewindow(msgwin);
x:=random(24)+1;
y:=random(15)+1;
openwindow(x,y,x+45,y+6,msgwin);
tframewin(blankerstr,
doubleframe,attr,attr);
fillwin(#32,attr);
textattr:=attr;
getdatetime;
WriteStr((48-LENGTH(datestr)) DIV 2,2,datestr,attr);
WriteStr(16,4,'Press any key',attr);
END; { time to move }
END; { blankon }
IF NOT blankon THEN
BEGIN
IF timetoblank< ((nmin*60)+nsec)-((omin*60)+osec)THEN
BEGIN
blankon:= TRUE;
REPEAT
gettime(ohour,omin,osec,osec100);
UNTIL (osec MOD timetomove)=0; { 0.725 put onto regular boundry }
openwindow(1,1,80,25,blankwin);
fillwin(#32,blankattr);
openwindow(15,8,60,14,msgwin);
tframewin(blankerstr,
doubleframe,attr,attr);
fillwin(#32,attr);
textattr:=attr;
getdatetime;
WriteStr((48-LENGTH(datestr)) DIV 2,2,datestr,attr);
WriteSTr(16,4,'Press any key',attr);
END; { start up blanker }
END; { not blankon }
IF (tscans <> -1) THEN tscans:= tscans-1;
keyhit := querykey(key);
IF keyhit THEN
BEGIN
keyhit:= ((key IN keysallowed) OR (keysallowed = []));
gettime(ohour,omin,osec,osec100);
IF blankon THEN
BEGIN
keyhit:= FALSE;
blankon:= FALSE;
unframewin;
closewindow(msgwin);
closewindow(blankwin);
END; { turn off blanker }
END; { keyhit }
END; { WHILE }
IF keyhit
THEN allowkey := key
ELSE allowkey := CHR(0);
END; { allowkey }
FUNCTION anykey: CHAR;
BEGIN { anykey }
anykey := allowkey([],-1);
END; { anykey }
PROCEDURE getxy(VAR x,y: INTEGER);
BEGIN { getxy }
X:= wherex;
y:= wherey;
END; { getxy }
BEGIN { SysSup }
hasmouse:= FALSE;
helpon:= FALSE;
inhelp:= FALSE;
blankon:= FALSE;
blankerstr:= 'Blanker';
END. { SysSup }